package org.goodsmanager.service;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.goodsmanager.entity.User;
import org.goodsmanager.mapper.UserMapper;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
import java.util.UUID;

/**
 * 用户服务类
 *
 * @author Goods Manager System
 * @version 1.0.0
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class UserService {

    private final UserMapper userMapper;
    private final BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();

    /**
     * 用户注册
     *
     * @param user 用户信息
     * @return 注册结果
     */
    public boolean register(User user) {
        try {
            // 检查用户名是否已存在
            if (userMapper.selectByUsername(user.getUsername()) != null) {
                log.warn("用户名 {} 已存在", user.getUsername());
                return false;
            }

            // 设置用户ID
            user.setId(UUID.randomUUID().toString());
            
            // 加密密码
            user.setPassword(passwordEncoder.encode(user.getPassword()));
            
            // 设置默认值
            user.setIsActive(1); // 默认启用
            user.setCreatedAt(LocalDateTime.now());
            user.setUpdatedAt(LocalDateTime.now());
            
            // 如果没有设置角色，默认为USER
            if (user.getRole() == null || user.getRole().isEmpty()) {
                user.setRole("USER");
            }

            // 插入用户
            int result = userMapper.insert(user);
            if (result > 0) {
                log.info("用户 {} 注册成功", user.getUsername());
                return true;
            } else {
                log.error("用户 {} 注册失败", user.getUsername());
                return false;
            }
        } catch (Exception e) {
            log.error("用户注册异常", e);
            return false;
        }
    }

    /**
     * 用户登录验证
     *
     * @param username 用户名
     * @param password 密码
     * @return 登录结果
     */
    public User login(String username, String password) {
        try {
            // 根据用户名查询用户
            User user = userMapper.selectByUsername(username);
            if (user == null) {
                log.warn("用户 {} 不存在", username);
                return null;
            }

            // 验证密码
            if (passwordEncoder.matches(password, user.getPassword())) {
                // 更新最后登录时间
                user.setLastLoginTime(LocalDateTime.now());
                userMapper.update(user);
                log.info("用户 {} 登录成功", username);
                return user;
            } else {
                log.warn("用户 {} 密码错误", username);
                return null;
            }
        } catch (Exception e) {
            log.error("用户登录异常", e);
            return null;
        }
    }

    /**
     * 根据ID查询用户
     *
     * @param id 用户ID
     * @return 用户信息
     */
    public User getUserById(String id) {
        try {
            return userMapper.selectById(id);
        } catch (Exception e) {
            log.error("根据ID查询用户异常", e);
            return null;
        }
    }

    /**
     * 根据用户名查询用户
     *
     * @param username 用户名
     * @return 用户信息
     */
    public User getUserByUsername(String username) {
        try {
            return userMapper.selectByUsername(username);
        } catch (Exception e) {
            log.error("根据用户名查询用户异常", e);
            return null;
        }
    }

    /**
     * 更新用户信息
     *
     * @param user 用户信息
     * @return 更新结果
     */
    public boolean updateUser(User user) {
        try {
            user.setUpdatedAt(LocalDateTime.now());
            int result = userMapper.update(user);
            if (result > 0) {
                log.info("用户 {} 更新成功", user.getUsername());
                return true;
            } else {
                log.error("用户 {} 更新失败", user.getUsername());
                return false;
            }
        } catch (Exception e) {
            log.error("更新用户信息异常", e);
            return false;
        }
    }

    /**
     * 查询所有用户
     *
     * @return 用户列表
     */
    public List<User> getAllUsers() {
        try {
            return userMapper.selectAll();
        } catch (Exception e) {
            log.error("查询所有用户异常", e);
            return null;
        }
    }
}